package httpserver

import (
	"fmt"
	"net/http"
	"time"
)

func LearnHttpForException() {
	http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {

		go func() {
			//这里起一个协程，会引起主线程的挂掉，同时导致其他的协程挂掉
			//为什么直接在父协程中无法捕获子协程中的异常
			panic("test panic in goroutin")
		}()

		//panic("test panic")
		//操作redis时，有人觉得这段代码可以放到协程中去运行，有一个非常大的隐患，就是父协程中无法捕获子协程的异常，如果读取出错，会把整个服务干掉
		w.Write([]byte("hello world!"))
	})

	http.ListenAndServe("127.0.0.1:8080", nil)

}

func f1() {
	//主协程
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("捕获到了")
		}
	}()
	//panic("error")

	//子协程中抛错
	go func() {
		panic("error")
	}()

	//最后,异常会被抛出，捕获不到的
	time.Sleep(10 * time.Second)
}

func LearFZRoutinException() {
	f1()
}
